/**
 * 目标：通过Object.keys()，实现某个对象的所有属性的访问器。
 * 思考：
 * 1. JavaScript中的对象具体包括哪些类型？
 * 2. 嵌套对象应该如何设置访问器？
 */

/**
 * @description 为普通对象的某个属性设置访问器
 * @param {*} obj 
 * @param {*} key 
 * @param {*} value 
 */
function defineReactive(obj, key, value) {
    value = obj[key];
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: function () {
            // 在此处收集依赖
            console.log('get:', value);
            return value;
        },
        set: function (newValue) {
            // 在此处通知依赖进行更新
            console.log('set:', newValue);
            value = newValue;
        }
    })
}

/**
 * @description 循环遍历，为普通对象的所有属性设置访问器
 * @param {*} obj 
 */
function walk (obj) {
    const keys = Object.keys(obj)
    for (let i = 0; i < keys.length; i++) {
      defineReactive(obj, keys[i])
    }
  }

//

const obj = {
    name: 'zs',
    age: 18,
}

walk(obj, 'name')
console.log(obj.name);
obj.name = 'ls'
console.log(obj.name);
obj.age = 20
console.log(obj.age);

//